#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>


int main()
{
    int fd = open("log.txt",O_RDONLY);
    dup2(fd,0);

    char buffer[2048];
    size_t s = read(0,buffer,sizeof(buffer));
    if(s>0)
    {
        buffer[s] = 0;
        printf("stdin redir:\n%s\n",buffer);
    }


    //int fd = open("log.txt",O_CREAT | O_WRONLY | O_TRUNC,0666); //重定向
    //int fd = open("log.txt",O_CREAT | O_WRONLY | O_APPEND,0666); //追加重定向
    //dup2(fd,1); //重定向
    //printf("hello fd:%d\n",fd);
    //fprintf(stdout,"hello fd:%d\n",fd);
    //fputs("hello world\n",stdout);

    //const char* message = "hello fwrite\n";
    //fwrite(message,1,strlen(message),stdout);





//     close(1);
//     int fd1 = open("log1.txt",O_WRONLY|O_CREAT|O_APPEND,0666);  
//     int fd2 = open("log2.txt",O_WRONLY|O_CREAT|O_APPEND,0666);  
//     int fd3 = open("log3.txt",O_WRONLY|O_CREAT|O_APPEND,0666);  
//     int fd4 = open("log4.txt",O_WRONLY|O_CREAT|O_APPEND,0666);  //追加
//     printf("fd1:%d\n",fd1);
//     printf("fd2:%d\n",fd2);
//     printf("fd3:%d\n",fd3);
//     printf("fd4:%d\n",fd4);
//
//     close(fd1);
//
//    printf("stdin: %d\n",stdin->_fileno);
//    printf("stdout: %d\n",stdout->_fileno);
//    printf("stderr: %d\n",stderr->_fileno);
//    FILE* fp = fopen("log.txt","w");
//    printf("fp:%d\n",fp->_fileno);

    //char buffer[128];
    //ssize_t s = read(0,buffer,sizeof(buffer));
    //if(s > 0)
    //{
    //    buffer[s-1] = 0; //避免回车多打一行
    //    printf("%s\n",buffer);
    //}

    //const char *message = "hello write\n";
    //write(1,message,strlen(message));


  //  int fd1 = open("log1.txt",O_WRONLY|O_CREAT|O_APPEND,0666);  
  //  int fd2 = open("log2.txt",O_WRONLY|O_CREAT|O_APPEND,0666);  
  //  int fd3 = open("log3.txt",O_WRONLY|O_CREAT|O_APPEND,0666);  
  //  int fd4 = open("log4.txt",O_WRONLY|O_CREAT|O_APPEND,0666);  //追加
  //  //int fd1 = open("log.txt",O_WRONLY|O_CREAT|O_TRUNC,0666); //清空
  //  if(fd1 < 0)
  //  {
  //      perror("open");
  //      return 1;
  //  }
  //  printf("fd1:%d\n",fd1);
  //  printf("fd2:%d\n",fd2);
  //  printf("fd3:%d\n",fd3);
  //  printf("fd4:%d\n",fd4);
  //  
  //  const char* message = "aaa\n";
  //  write(fd1,message,strlen(message));

  
  // C语言中字符串以\0结尾，但是在系统接口中不能加上1，即\0字符，会成为乱码
  //  write(fd1,message,strlen(message) + 1);
  //  write() 不关心字符串结束符，它只负责按指定长度写入字节。

  //  close(fd1);


    //umask(0);
    //open("log.txt",O_WRONLY|O_CREAT,0666); // 第一次创建最好使用三参数的open，设置mode权限 
    //open("log.txt",O_WRONLY|O_CREAT);
    return 0;
}
























////类似open标志位flags的设计，可以传递一个或者多个选项
//#define ONE   (1<<0)
//#define TWO   (1<<1)
//#define THREE (1<<2)
//#define FOUR  (1<<3)
//#define FIVE  (1<<4)
//
////code1
//void PrintTest(int flags)
//{
//    if(flags & ONE)
//    {
//        printf("one\n");
//    }
//    if(flags & TWO)
//    {
//        printf("two\n");
//    }
//    if(flags & THREE)
//    {
//        printf("three\n");
//    }
//    if(flags & FOUR)
//    {
//        printf("four\n");
//    }
//    if(flags & FIVE)
//    {
//        printf("five\n");
//    }
//}
//int main()
//{
//    printf("=================\n");
//    PrintTest(ONE);
//    printf("=================\n");
//    PrintTest(TWO);
//    printf("=================\n");
//    PrintTest(THREE);
//    printf("=================\n");
//    PrintTest(ONE | TWO | THREE);
//    printf("=================\n");
//    PrintTest(ONE | TWO | THREE | FOUR);
//    printf("=================\n");
//    PrintTest(ONE | TWO | THREE | FOUR | FIVE);
//    printf("=================\n");
//    return 0;
//}
